
package com.afd.ozblip.util;

import android.content.Context;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Toast;

/**
 * 数据加载公共类
 * 
 * @author 徐鹏
 */
public class AsyncLoadData extends AsyncTask<Object, Integer, Object> {

    // 启动内容
    private Context mContext;
    // 提示框内容
    private String dialogTitle;
    // 异步加载执行方法
    private AsyncAction mLoadMethod;
    // 判断是否存在网络
    private boolean hasNet = true;
    // 是否可以取消加载框
    private boolean isCancel = true;

    private View showView;

    public AsyncLoadData(Context paramContext, String paramTitle,
            AsyncAction paramLoad) {
        this.mContext = paramContext;
        this.dialogTitle = paramTitle;
        this.mLoadMethod = paramLoad;
    }

    public AsyncLoadData(Context paramContext, AsyncAction paramLoad) {
        this.mContext = paramContext;
        this.mLoadMethod = paramLoad;
    }

    /**
     * 设置是否允许取消
     * 
     * @param paramContext
     * @param allowCancel 默认true
     * @param paramLoad
     */
    public AsyncLoadData(Context paramContext, String paramTitle,
            boolean allowCancel, AsyncAction paramLoad) {
        this.mContext = paramContext;
        this.dialogTitle = paramTitle;
        this.mLoadMethod = paramLoad;
        this.isCancel = allowCancel;
    }

    public AsyncLoadData(Context paramContext, View showV, AsyncAction paramLoad) {
        this.mContext = paramContext;
        this.showView = showV;
        this.mLoadMethod = paramLoad;
    }

    @Override
    protected void onPreExecute() {
        // 第一个执行方法
        // 判断是否有网络
        if (!PhoneUtil.hasNetwork(mContext)) {
            hasNet = false;
            Toast.makeText(mContext, "温馨提示：请检查你的网络连接!", Toast.LENGTH_LONG)
                    .show();
            mLoadMethod.noNet();
            return;
        }
        try {
            mLoadMethod.loadBegin(mContext, dialogTitle, isCancel);
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Object... params) {
        // 第二个执行方法,onPreExecute()执行完后执行
        if (!hasNet) {
            return null;
        }
        try {
            mLoadMethod.doLoad();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "执行完毕";
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        // 这个函数在doInBackground调用publishProgress时触发，虽然调用时只有一个参数
        // 但是这里取到的是一个数组,所以要用progesss[0]来取值
        // 第n个参数就用progress[n]来取值
        super.onProgressUpdate(progress);
    }

    @Override
    protected void onPostExecute(Object result) {
        // doInBackground返回时触发，换句话说，就是doInBackground执行完后触发
        // 这里的result就是上面doInBackground执行后的返回值，所以这里是"执行完毕"
        if (!hasNet) {
            return;
        }
        // 判断是否终止
        if (dialogIsCancel()) {
            return;
        }
        if (mLoadMethod.paramDialog != null
                && mLoadMethod.paramDialog.isShowing()) {
            try {
                mLoadMethod.paramDialog.dismiss();
            } catch (Exception e) {
            }

        }
        try {
            mLoadMethod.loadEnd();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onPostExecute(result);
    }

    /**
     * 更新进度
     * 
     * @param values
     */
    public void updateProgress(Integer... values) {
        publishProgress(values);
    }

    private boolean dialogIsCancel() {
        if (mLoadMethod.paramDialog != null
                && !mLoadMethod.paramDialog.isShowing()) {
            return true;
        } else {
            return false;
        }
    }

}
